﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BreukTrainer_EE_.BreukModel;
using BreukTrainer_EE_.Controller;


namespace BreukTrainer_EE_.View
{
    public partial class UitvoerenOpdracht : Form
    {
        private ActiveUserController auc;
        private Boolean started;
        public UitvoerenOpdracht(Opdracht o)
        {
            InitializeComponent();
            auc = new ActiveUserController(o);
            started = false;
        }

        private void initProgressBar(ProgressBar progres)
        {
            progres.Maximum = auc.getAantal();
        }
        private void UitvoerenOpdracht_Load(object sender, EventArgs e)
        {
            if (auc.getAantal() > 0)
            {
                setCurrentLeerling();
            }
            else {
                btnToonOpl.Enabled = false;
                MessageBox.Show("Er zijn geen uit te voeren opdrachten");
                this.Dispose(false);
            }
        }
        private void startOpdrachten() {
            dgvOpdracht.Visible = true;
            this.opdrachtDetailTableAdapter.FillByOpdrachtID(this.breukTrainerDBDataSet.OpdrachtDetail,auc.Opdracht.OpdrachtID);
            dgvOpdracht.Columns[3].Visible = false;
            dgvOpdracht.Enabled = true;
        }

        private void btnStartOpdr_Click(object sender, EventArgs e)
        {
            if (auc.getActiveLeerling() != null)
            {
                Button knop = (Button)sender;
                knop.Text = "Volgende leerling";
                knop.Click -= btnStartOpdr_Click;
                knop.Click += clearList;
                knop.Enabled = false;
                startOpdrachten();
                btnRegistreerOpl.Enabled = true;
                initProgressBar(this.prbActLeerling);
                startOpgaveTimer();
                started = true;
            }
        }
        public void startOpgaveTimer() {
                pgbOpgave.Enabled = true;
                if (auc.Opdracht.Tijdslimiet == null)
                {
                    pgbOpgave.Maximum = auc.genereerTijdslimiet();                    
                }
                else {
                     pgbOpgave.Maximum = (int)auc.Opdracht.Tijdslimiet;
                }
                pgbOpgave.Step = 1;
                pgbOpgave.Value = 0;
                pgbOpgave.Visible = true;
                opgaveTimer.Enabled = true;
        }
        private void btnRegistreerOpdracht_Click(object sender, EventArgs e) {
            opgaveTimer.Enabled = false;
            Button knop = (Button)sender;
            int score = 0;
            bool fout = false;
            int maxscore = this.dgvOpdracht.Rows.Count;
            long odi=0;
            string atekst = "";
            for (int i = 0; i < maxscore; i++)
            {
                try
                {
                    fout = !(Breuk.Parse(dgvOpdracht.Rows[i].Cells[2].Value.ToString()) == Breuk.Parse(dgvOpdracht.Rows[i].Cells[3].Value.ToString()));
                    atekst = dgvOpdracht.Rows[i].Cells[2].Value.ToString();
                }
                catch (Exception) { fout = true; atekst = ""; }
                if (fout)
                {
                    dgvOpdracht.Rows[i].Cells[2].Style.BackColor = Color.Red;
                }
                else
                {
                    dgvOpdracht.Rows[i].Cells[2].Style.BackColor = Color.Green;
                    score++;
                }
                odi = (long)dgvOpdracht.Rows[i].Cells[0].Value;
            //Accessor.insertLeerlingDetailOpdracht(atekst, fout, auc.getActiveLeerling().LeerlingID, odi); MET LINQ
                this.leerlingOpdrachtDetailTableAdapter.InsertLlnOpdrDetQuery(atekst, fout, auc.getActiveLeerling().LeerlingID, odi); // met datasets
            }
            this.opdrachtTableAdapter.OpdrachtAfgewerkt(auc.getActiveLeerling().LeerlingID,auc.Opdracht.OpdrachtID);
            this.leerlingOpdrachtTableAdapter.OpdrachtAfgewerkt(auc.getActiveLeerling().LeerlingID, auc.Opdracht.OpdrachtID);
            this.dgvOpdracht.Columns[3].Visible = true;
            this.lblScore.Text = score.ToString()+" / "+maxscore;
            this.dgvOpdracht.ClearSelection();
            this.dgvOpdracht.Enabled = false;
            knop.Enabled = false;
            this.btnToonOpl.Enabled = true;
            if (auc.nextLeerling())
            {
                //dialoog leerling heeft alle opdracte afgewerkt, volgende
                MessageBox.Show("Opdracht succesvol geregistreerd","Opdracht Geregistreerd");
            }
            else {
                this.btnToonOpl.Enabled = false;
                //alle opdrachten zijn gedaan
                MessageBox.Show("Alle leerlingen hebben hun opdracten uitgevoerd","Opdrachten geregistreerd");
            }
            started = false;
        }
        public void clearList(object sender, EventArgs e)
        {
            dgvOpdracht.Visible = false;
            pgbOpgave.Visible = false;
            nextLeerling();
            Button knop = ((Button)sender);
            knop.Click += btnStartOpdr_Click;
            knop.Click -= clearList;
            knop.Text = "Start opdracht";
        }
        /// <summary>
        /// Volgende leerling in de progress aanduiden
        /// </summary>
        private void nextLeerling() {
            prbActLeerling.Increment(1);
            setCurrentLeerling();
        }
        /// <summary>
        /// In de bovenste tekstveldjes de leerling en klas tonen
        /// De vooruitgang van welke leerling bezig is
        /// </summary>
        private void setCurrentLeerling() {
            txtLeerling.Text = auc.getActiveLeerling().Naam;
            txtKlas.Text = auc.getActiveLeerling().Klas;
            lblProgres.Text = "Leerling "+(auc.Active+1)+" vd "+auc.getAantal();
        }

        private void opgaveTimer_Tick(object sender, EventArgs e)
        {
            pgbOpgave.PerformStep();
            if (pgbOpgave.Value == pgbOpgave.Maximum)
            {
                opgaveTimer.Enabled = false;
                dgvOpdracht.Enabled = false;
                MessageBox.Show("De tijd is om, registreer u opdracht", "Tijd verstreken");
            }

        }

        private void UitvoerenOpdracht_FormClosed(object sender, FormClosedEventArgs e)
        {
            new ViewOpdrachten().Show();
        }

        private void UitvoerenOpdracht_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (started) {
                e.Cancel = true;
                MessageBox.Show("Gelieve eerst je oefening te registreren vooraleer af te sluiten","Oefening Bezig");
            }
        }

    }
}
